﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using BLL;
using Exceptions;
using BTO;

namespace CentralReserva
{
    public class MenuAlojamentos
    {
        private static int opcao = 0;

        public static void menuAlojamentos()
        {
            do
            {
                Console.WriteLine("Menu Alojamentos: Escolha uma das opçoes disponiveis.\n\n");
                Console.WriteLine(" 1 - Registar novo alojamento - permite o registo de novos alojamentos;\n" +
                                  " 2 - Consultar alojamento - consultar, editar e eliminar alojamentos;\n" +

                                  " 0 - Voltar ao menu principal;\n");

                string aux = Console.ReadLine();
                if (int.TryParse(aux, out opcao))
                {
                    Console.WriteLine("\n");
                    switch (opcao)
                    {
                        case 1:
                            Console.Clear();
                            registarAlojamento();
                            break;
                        case 2:
                            Console.Clear();
                            menuConsultarAlojamentos();
                            break;
                        case 0:
                            Console.Clear();
                            MenuPrincipal.menuPrincipal();
                            break;
                        default:
                            Console.Clear();
                            Console.WriteLine("Introduza a uma opcao valida. [0-2]\n");
                            break;
                    }
                }
                else
                {
                    opcao = -1;
                    Console.Clear();
                    Console.WriteLine("Por favor introduza apenas numeros.\n");
                }
            } while (opcao != 0);
        }

        private static void registarAlojamento()
        {
            BTO.Alojamento alojamento = new BTO.Alojamento();
            try
            {
                Boolean endWhile = false;

                do{
                    try{
                        Console.Write("Nome: ");
                        string nome = Console.ReadLine();
                        alojamento.nome = nome;
                        endWhile = true;
                    }
                    catch(FoundAlojamentoNomeException ex)
                    {
                        Console.WriteLine(ex.Message + "Por favor volte a introduzir o nome.");
                    }
                }while(!endWhile);
                endWhile = false;

                Console.Write("Morada: ");
                string morada = Console.ReadLine();
                alojamento.morada = morada;

                do{
                    Console.Write("IDTipoAlojamento: ");
                    string tipoAlojamento = Console.ReadLine();
                    int idTipoAlojamento = 0;
                    if(int.TryParse(tipoAlojamento, out idTipoAlojamento))
                    {
                        alojamento.IDTipoAlojamento = idTipoAlojamento;
                        endWhile = true;
                    }else{
                        Console.WriteLine("Os id's apenas aceitam valores do tipo inteiro.");
                        Console.WriteLine("Por favor volte a introduzir o id.");
                    }
                }while(!endWhile);
                endWhile = false;

                do{
                    Console.Write("Lotacao: ");
                    string slotacao = Console.ReadLine();
                    int ilotacao = 0;
                    if(int.TryParse(slotacao, out ilotacao))
                    {
                        alojamento.lotacao = ilotacao;
                        endWhile = true;
                    }else{
                        Console.WriteLine("A lotacao apenas aceita valores do tipo inteiro.");
                        Console.WriteLine("Por favor volte a introduzir a lotacao.");
                    }
                }while(!endWhile);
                endWhile = false;

                Console.Write("Telefone: ");
                string telefone = Console.ReadLine();
                alojamento.telefone = telefone;

                Console.Write("E-mail: ");
                string email = Console.ReadLine();
                alojamento.email = email;

                do{
                    Console.Write("IDLocal: ");
                    string local = Console.ReadLine();
                    int idLocal = 0;
                    if(int.TryParse(local, out idLocal))
                    {
                        alojamento.IDLocal = idLocal;
                        endWhile = true;
                    }else{
                        Console.WriteLine("Os id's apenas aceitam valores do tipo inteiro.");
                        Console.WriteLine("Por favor volte a introduzir o id.");
                    }
                }while(!endWhile);
                endWhile = false;

                do{
                    Console.Write("IDCategoria: ");
                    string categoria = Console.ReadLine();
                    int idCategoria = 0;
                    if(int.TryParse(categoria, out idCategoria))
                    {
                        alojamento.IDCategoria = idCategoria;
                        endWhile = true;
                    }else{
                        Console.WriteLine("Os id's apenas aceitam valores do tipo inteiro.");
                        Console.WriteLine("Por favor volte a introduzir o id.");
                    }
                }while(!endWhile);
                endWhile = false;

                Console.WriteLine("\nA escrever na base de dados. . . \n");

                BLLAlojamento novoTipo = new BLLAlojamento();

                novoTipo.insert(alojamento);

                Console.WriteLine("Novo alojamento registado com sucesso!\n");

            }

            catch (NotFoundCategoriaException e)
            {
                Boolean endWhile = false;
                Console.WriteLine(e.Message + "\n");
                Console.Write("Pretende introduzir novamente? (y/n)\n ");
                string resposta = Console.ReadLine();
                if (resposta == "y" || resposta == "Y" || resposta == "yes" || resposta == "Yes")
                {
                    do{
                        Console.Write("IDCategoria: ");
                        string categoria = Console.ReadLine();
                        int idCategoria = 0;
                        if(int.TryParse(categoria, out idCategoria))
                        {
                            alojamento.IDCategoria = idCategoria;
                            endWhile = true;
                        }else{
                            Console.WriteLine("Os id's apenas aceitam valores do tipo inteiro.");
                            Console.WriteLine("Por favor volte a introduzir o id.");
                        }
                    }while(!endWhile);
                    endWhile = false;

                    Console.WriteLine("\nA escrever na base de dados. . . \n");
                    registarAlojamento(alojamento);
                    Console.WriteLine("Registo efectuado com sucesso!\n\n");

                }else{
                    menuAlojamentos();
                }
            }

            catch (NotFoundLocalException e)
            {
                Boolean endWhile = false;
                Console.WriteLine(e.Message + "\n");
                Console.Write("Pretende introduzir novamente? (y/n)\n ");
                string resposta = Console.ReadLine();
                if (resposta == "y" || resposta == "Y" || resposta == "yes" || resposta == "Yes")
                {
                    do{
                        Console.Write("IDLocal: ");
                        string local = Console.ReadLine();
                        int idLocal = 0;
                        if(int.TryParse(local, out idLocal))
                        {
                            alojamento.IDLocal = idLocal;
                            endWhile = true;
                        }else{
                            Console.WriteLine("Os id's apenas aceitam valores do tipo inteiro.");
                            Console.WriteLine("Por favor volte a introduzir o id.");
                        }
                    }while(!endWhile);
                    endWhile = false;

                    Console.WriteLine("\nA escrever na base de dados. . . \n");
                    registarAlojamento(alojamento);
                    Console.WriteLine("Registo efectuado com sucesso!\n\n");

                }else{
                    menuAlojamentos();
                }
            }
            catch (NotFoundTipoAlojamentoException e)
            {
                Boolean endWhile = false;
                Console.WriteLine(e.Message + "\n");
                Console.Write("Pretende introduzir novamente? (y/n)\n ");
                string resposta = Console.ReadLine();
                if (resposta == "y" || resposta == "Y" || resposta == "yes" || resposta == "Yes")
                {
                    do{
                        Console.Write("IDTipoAlojamento: ");
                        string tipoAlojamento = Console.ReadLine();
                        int idTipoAlojamento = 0;
                        if(int.TryParse(tipoAlojamento, out idTipoAlojamento))
                        {
                            alojamento.IDTipoAlojamento = idTipoAlojamento;
                            endWhile = true;
                        }else{
                            Console.WriteLine("Os id's apenas aceitam valores do tipo inteiro.");
                            Console.WriteLine("Por favor volte a introduzir o id.");
                        }
                    }while(!endWhile);
                    endWhile = false;

                    Console.WriteLine("\nA escrever na base de dados. . . \n");
                    registarAlojamento(alojamento);
                    Console.WriteLine("Registo efectuado com sucesso!\n\n");

                }else{
                    menuAlojamentos();
                }
            }

            catch (FoundAlojamentoNomeException e)
            {
                Console.WriteLine(e.Message + "\n");
                Console.Write("Pretende introduzir novamente? (y/n)\n ");
                string resposta = Console.ReadLine();
                if (resposta == "y" || resposta == "Y" || resposta == "yes" || resposta == "Yes")
                {
                    Console.Write("Introduza novamente o nome:\n ");
                    string nome = Console.ReadLine();
                    alojamento.nome = nome;

                    Console.WriteLine("\nA escrever na base de dados. . . \n");
                    registarAlojamento(alojamento);
                    Console.WriteLine("Registo efectuado com sucesso!\n\n");
                }
                else
                {
                    menuAlojamentos();
                }
            }


            catch (Exception e)
            {
                Console.WriteLine(e.Message + "\n");
            }

            menuAlojamentos();
        }

        private static void registarAlojamento(BTO.Alojamento toInsert)
        {
            try
            {
                BLLAlojamento alojamento = new BLLAlojamento();
                alojamento.insert(toInsert);
            }

            catch (NotFoundCategoriaException e)
            {
                Boolean endWhile = false;
                Console.WriteLine(e.Message + "\n");
                Console.Write("Pretende introduzir novamente? (y/n)\n ");
                string resposta = Console.ReadLine();
                if (resposta == "y" || resposta == "Y" || resposta == "yes" || resposta == "Yes")
                {
                    do{
                        Console.Write("IDCategoria: ");
                        string categoria = Console.ReadLine();
                        int idCategoria = 0;
                        if(int.TryParse(categoria, out idCategoria))
                        {
                            toInsert.IDCategoria = idCategoria;
                            endWhile = true;
                        }else{
                            Console.WriteLine("Os id's apenas aceitam valores do tipo inteiro.");
                            Console.WriteLine("Por favor volte a introduzir o id.");
                        }
                    }while(!endWhile);
                    endWhile = false;

                    Console.WriteLine("\nA escrever na base de dados. . . \n");
                    registarAlojamento(toInsert);

                }else{
                    menuAlojamentos();
                }
            }

            catch (NotFoundLocalException e)
            {
                Boolean endWhile = false;
                Console.WriteLine(e.Message + "\n");
                Console.Write("Pretende introduzir novamente? (y/n)\n ");
                string resposta = Console.ReadLine();
                if (resposta == "y" || resposta == "Y" || resposta == "yes" || resposta == "Yes")
                {
                    do{
                        Console.Write("IDLocal: ");
                        string local = Console.ReadLine();
                        int idLocal = 0;
                        if(int.TryParse(local, out idLocal))
                        {
                            toInsert.IDLocal = idLocal;
                            endWhile = true;
                        }else{
                            Console.WriteLine("Os id's apenas aceitam valores do tipo inteiro.");
                            Console.WriteLine("Por favor volte a introduzir o id.");
                        }
                    }while(!endWhile);
                    endWhile = false;

                    Console.WriteLine("\nA escrever na base de dados. . . \n");
                    registarAlojamento(toInsert);

                }else{
                    menuAlojamentos();
                }
            }
            catch (NotFoundTipoAlojamentoException e)
            {
                Boolean endWhile = false;
                Console.WriteLine(e.Message + "\n");
                Console.Write("Pretende introduzir novamente? (y/n)\n ");
                string resposta = Console.ReadLine();
                if (resposta == "y" || resposta == "Y" || resposta == "yes" || resposta == "Yes")
                {
                    do{
                        Console.Write("IDTipoAlojamento: ");
                        string tipoAlojamento = Console.ReadLine();
                        int idTipoAlojamento = 0;
                        if(int.TryParse(tipoAlojamento, out idTipoAlojamento))
                        {
                            toInsert.IDTipoAlojamento = idTipoAlojamento;
                            endWhile = true;
                        }else{
                            Console.WriteLine("Os id's apenas aceitam valores do tipo inteiro.");
                            Console.WriteLine("Por favor volte a introduzir o id.");
                        }
                    }while(!endWhile);
                    endWhile = false;

                    Console.WriteLine("\nA escrever na base de dados. . . \n");
                    registarAlojamento(toInsert);

                }else{
                    menuAlojamentos();
                }
            }
            catch (FoundAlojamentoNomeException e)
            {
                Console.WriteLine(e.Message + "\n");
                Console.Write("Pretende introduzir novamente? (y/n)\n ");
                string resposta = Console.ReadLine();
                if (resposta == "y" || resposta == "Y" || resposta == "yes" || resposta == "Yes")
                {
                    Console.Write("Introduza novamente o nome:\n ");
                    string nome = Console.ReadLine();
                    toInsert.nome = nome;
                    registarAlojamento(toInsert);
                    Console.WriteLine("Novo alojamento registado com sucesso!\n");
                }
                else
                {
                    menuAlojamentos();
                }
            }
            catch (Exception e)
            {
                Console.WriteLine(e.Message + "\n");
            }

            menuAlojamentos();
        }

        private static void menuConsultarAlojamentos()
        {
            do
            {
                opcao = 0;
                Console.WriteLine("Menu de consulta e gestao de alojamentos, \nescolha uma das operacoes:\n\n");
                Console.WriteLine(" 1 - Listar todos os alojamentos registados;\n" +
                                  " 2 - Listar por id;\n" +
                                  " 3 - Listar por nome;\n" +
                                  " 4 - Listar por tipo;\n" +
                                  " 5 - Listar por categoria\n" +
                                  " 6 - Listar por local\n" +
                                  " 0 - Voltar ao Menu Alojamentos;\n");

                string aux = Console.ReadLine();
                if (int.TryParse(aux, out opcao))
                {
                    Console.WriteLine("\n");
                    switch (opcao)
                    {
                        case 1:
                            Console.Clear();
                            listarAlojamentos();
                            break;
                        case 2:
                            Console.Clear();
                            listarAlojamentosPorId();
                            break;
                        case 3:
                            Console.Clear();
                            listarAlojamentosPorNome();
                            break;
                        case 4:
                            Console.Clear();
                            listarAlojamentosPorTipo();
                            break;
                        case 5:
                            Console.Clear();
                            listarAlojamentosPorCategoria();
                            break;
                        case 6:
                            Console.Clear();
                            listarAlojamentosPorLocal();
                            break;
                        case 0:
                            Console.Clear();
                            menuAlojamentos();
                            break;
                        default:
                            Console.WriteLine("Introduza a uma opcao valida. [0-6]\n");
                            break;
                    }
                }
                else
                {
                    opcao = -1;
                    Console.Clear();
                    Console.WriteLine("Por favor introduza apenas numeros.\n");
                }
            } while (opcao != 0);
        }

        private static void listarAlojamentos()
        {

            Console.WriteLine("Lista dos alojamentos registados: \n\n");
            Console.WriteLine("A carregar lista . . .\n");
            BLLAlojamento alojamento = new BLLAlojamento();
            try
            {
                List<BTO.Alojamento> listAlojamentos = alojamento.list();
                Console.WriteLine("Lista ok!\n\n");

                int counter = 1;
                foreach (BTO.Alojamento a in listAlojamentos)
                {
                    Console.WriteLine("\n\n" + counter + ": ");
                    Console.WriteLine(a);
                    counter++;
                }
            }
            catch (NotFoundAlojamentoException ex)
            {
                Console.WriteLine(ex.Message + "\n\n");
            }
            Console.WriteLine("\n\nQuando desejar pressione \"enter\" para voltar ao menu de gestao de tipos de transporte.");

            //Listener para averiguar se o utilizador pressiona enter
            ConsoleKeyInfo keyHit = new ConsoleKeyInfo();
            keyHit = Console.ReadKey(true);

            if (keyHit.Key == ConsoleKey.Enter) { Console.Clear(); menuConsultarAlojamentos(); }
        }

        private static void listarAlojamentosPorId()
        {

            Console.WriteLine("Apos seleccionar o alojamento, vai poder efectuar operacoes sobre o mesmo.\n");
            Console.Write("Introduza o id do alojamento que procura: ");
            int id = -1;
            String aux = Console.ReadLine();

            if (int.TryParse(aux, out id))
            {
                Console.WriteLine("\nA procurar . . .\n");
                BLLAlojamento novoAlojamento = new BLLAlojamento();

                try
                {
                    Console.WriteLine(novoAlojamento.getByID(id));
                    Console.WriteLine("\n");
                    operarSobreAlojamento(novoAlojamento.getByID(id));
                    menuConsultarAlojamentos();
                }
                catch (NotFoundAlojamentoException ex)
                {

                    Console.WriteLine("\n" + ex.Message + " Por favor verifique o id do alojamento e introduza novamente.\n\n");
                    Console.WriteLine("Prefere sair para o menu anterior? (y/n)");
                    string resposta = Console.ReadLine();
                    if (resposta == "y" || resposta == "Y" || resposta == "yes" || resposta == "Yes")
                    {
                        Console.Clear();
                        menuConsultarAlojamentos();
                    }
                    else
                    {
                        Console.Clear();
                        listarAlojamentosPorId();
                    }
                }

            }
            else
            {
                Console.WriteLine("\nAtencao o id apenas pode conter numeros inteiros.\n");
                Console.WriteLine("\nPor favor volte a introduzir o id.\n\n\n");
                listarAlojamentosPorId();
            }

        }

        private static void listarAlojamentosPorNome()
        {

            Console.WriteLine("Apos seleccionar o alojamento, vai poder efectuar operacoes sobre o mesmo.\n");
            Console.Write("Introduza o nome do alojamento que procura: ");

            String nome = Console.ReadLine();
            
            Console.WriteLine("\nA procurar . . .\n");
            BLLAlojamento novoAlojamento = new BLLAlojamento();

            try
            {
                Console.WriteLine(novoAlojamento.getByNome(nome));
                Console.WriteLine("\n");
                operarSobreAlojamento(novoAlojamento.getByNome(nome));
                menuConsultarAlojamentos();
            }
            catch (NotFoundAlojamentoException ex)
            {

                Console.WriteLine("\n" + ex.Message + " Por favor verifique o nome do alojamento e introduza novamente.\n\n");
                Console.WriteLine("Prefere sair para o menu anterior? (y/n)");
                string resposta = Console.ReadLine();
                if (resposta == "y" || resposta == "Y" || resposta == "yes" || resposta == "Yes")
                {
                    Console.Clear();
                    menuConsultarAlojamentos();
                }
                else
                {
                    Console.Clear();
                    listarAlojamentosPorNome();
                }
            }
        }

        private static void listarAlojamentosPorTipo()
        {
            Console.WriteLine("Escolha um tipo de alojamento dos listados abaixo. \n");
            BLLTipoAlojamento tipoAlojamento = new BLLTipoAlojamento();
            List<BTO.TipoAlojamento> listaTipos = tipoAlojamento.list();
            int count = 1;
            foreach (BTO.TipoAlojamento tipo in listaTipos)
            {
                Console.WriteLine(count + ":");
                Console.WriteLine(tipo);
                Console.WriteLine("\n");
                count++;
            }

            Console.Write("Introduza o id do tipo de alojamento que procura: ");
            String idTipo = Console.ReadLine();
            int idTipoAlojamento = 0;

            if (int.TryParse(idTipo, out idTipoAlojamento))
            {

                Console.WriteLine("\nA procurar . . .\n");
                try
                {
                    BLLAlojamento bllAlojamentos = new BLLAlojamento();
                    List<BTO.Alojamento> listAlojamentos = bllAlojamentos.getByTipoAlojamento(idTipoAlojamento);
                    
                    foreach(BTO.Alojamento umAlojamento in listAlojamentos)
                    {
                        Console.WriteLine(umAlojamento);
                        Console.WriteLine("\n");
                    }
                }
                catch (NotFoundAlojamentoException ex)
                {

                    Console.WriteLine("\n" + ex.Message + "\nNao foram encontrados alojamentos com esse tipo.\n\n");
                    menuConsultarAlojamentos();
                }
            }
        }

        private static void listarAlojamentosPorCategoria()
        {
            Console.WriteLine("Escolha uma categoria de alojamento das listadas abaixo. \n");
            BLLCategoria tipoCategoria = new BLLCategoria();
            List<BTO.Categoria> listaCategorias = tipoCategoria.list();
            int count = 1;
            foreach (BTO.Categoria categoria in listaCategorias)
            {
                Console.WriteLine(count + ":");
                Console.WriteLine(categoria);
                Console.WriteLine("\n");
                count++;
            }

            Console.Write("Introduza o id categoria de alojamento que procura: ");
            String id = Console.ReadLine();
            int idCategoria = 0;

            if (int.TryParse(id, out idCategoria))
            {

                Console.WriteLine("\nA procurar . . .\n");
                try
                {
                    BLLAlojamento bllAlojamentos = new BLLAlojamento();
                    List<BTO.Alojamento> listAlojamentos = bllAlojamentos.getByCategoria(idCategoria);
                    
                    foreach(BTO.Alojamento umAlojamento in listAlojamentos)
                    {
                        Console.WriteLine(umAlojamento);
                        Console.WriteLine("\n");
                    }
                }
                catch (NotFoundAlojamentoException ex)
                {

                    Console.WriteLine("\n" + ex.Message + "\nNao foram encontrados alojamentos com essa categoria.\n\n");
                    menuConsultarAlojamentos();
                }
            }
        }
        
        private static void listarAlojamentosPorLocal()
        {
            Console.WriteLine("Escolha um local dos listados abaixo. \n");
            BLLLocal bllLocal = new BLLLocal();
            List<BTO.Local> listaLocais = bllLocal.list();
            int count = 1;
            foreach (BTO.Local local in listaLocais)
            {
                Console.WriteLine(count + ":");
                Console.WriteLine(local);
                Console.WriteLine("\n");
                count++;
            }

            Console.Write("Introduza o id do local do alojamento que procura: ");
            String idLocal = Console.ReadLine();
            int idLocalAlojamento = 0;

            if (int.TryParse(idLocal, out idLocalAlojamento))
            {

                Console.WriteLine("\nA procurar . . .\n");
                try
                {
                    BLLAlojamento bllAlojamentos = new BLLAlojamento();
                    List<BTO.Alojamento> listAlojamentos = bllAlojamentos.getByIDLocal(idLocalAlojamento);
                    
                    foreach(BTO.Alojamento umAlojamento in listAlojamentos)
                    {
                        Console.WriteLine(umAlojamento);
                        Console.WriteLine("\n");
                    }
                }
                catch (NotFoundAlojamentoException ex)
                {

                    Console.WriteLine("\n" + ex.Message + "\nNao foram encontrados alojamentos com nesse local.\n\n");
                    menuConsultarAlojamentos();
                }
            }
        }

        private static void operarSobreAlojamento(BTO.Alojamento alojamento)
        {
            do
            {
                opcao = 0;
                Console.WriteLine("Menu de gestao do alojamento " + alojamento.nome + ", escolha uma das operacoes:\n\n");
                Console.WriteLine(" 1 - Editar informacoes do alojamento;\n" +
                                  " 2 - Eliminar o alojamento;\n" +
                                  " 0 - Voltar ao menu de consulta e gestao;\n");

                string aux = Console.ReadLine();
                if (int.TryParse(aux, out opcao))
                {
                    Console.WriteLine("\n");
                    switch (opcao)
                    {
                        case 1:
                            Console.Clear();
                            actualizarAlojamento(alojamento);
                            break;
                        case 2:
                            Console.Clear();
                            eliminarAlojamento(alojamento);
                            break;
                        case 0:
                            Console.Clear();
                            menuConsultarAlojamentos();
                            break;
                        default:
                            Console.WriteLine("Introduza a uma opcao valida. [0-2]\n");
                            break;
                    }
                }
                else
                {
                    opcao = -1;
                    Console.Clear();
                    Console.WriteLine("Por favor introduza apenas numeros.\n");
                }
            } while (opcao != 0);
        }

        private static void actualizarAlojamento(BTO.Alojamento toUpdate)
        {
            Boolean endWhile = false;

            Console.WriteLine("Edicao e actualizacao dos dados do alojamento " + toUpdate.nome + ".\n");
            Console.WriteLine("A esquerda é fornecida a informacao actual;");
            Console.WriteLine("Do lado direito pode editar a informacao, ou manter a antiga.\n\n");

            BLLAlojamento alojamento = new BLLAlojamento();
            BTO.Alojamento oldAlojamento = toUpdate;
            BTO.Alojamento newAlojamento = new BTO.Alojamento();

            newAlojamento.IDAlojamento = oldAlojamento.IDAlojamento;

            do{
                Console.Write("Nome (" + oldAlojamento.nome + "): ");
                string newNome = Console.ReadLine();
                try{
                    if (newNome == "")
                    {
                        newAlojamento.nome = oldAlojamento.nome;
                        endWhile = true;
                    }else{
                        newAlojamento.nome = newNome;
                        endWhile = true;
                    }
                }
                catch(FoundAlojamentoNomeException ex)
                {
                    Console.WriteLine("\n" + ex.Message +", Por favor introduza outro nome!\n");
                }
            }while(!endWhile);
            endWhile = false;

            Console.WriteLine("Morada (" + oldAlojamento.morada + "): ");
            String newMorada = Console.ReadLine();
            if(newMorada == "")
                newAlojamento.morada = oldAlojamento.morada;
            else
                newAlojamento.morada = newMorada;

            do{
                try{
                    Console.Write("IDTipoAlojamento (" + oldAlojamento.IDTipoAlojamento + "): ");
                    string newIdTipoAlojamento = Console.ReadLine();
                    if(newIdTipoAlojamento.Equals(""))
                        newIdTipoAlojamento = "-1";
                    int idTipoAlojamento = -1;
                    if(int.TryParse(newIdTipoAlojamento, out idTipoAlojamento))
                    {
                        if (idTipoAlojamento == -1)
                            {
                                newAlojamento.IDTipoAlojamento = oldAlojamento.IDTipoAlojamento;
                                endWhile = true;
                            }else{
                                newAlojamento.IDAlojamento = idTipoAlojamento;
                                endWhile = true;
                            }
                    }else{
                        Console.WriteLine("Os id's apenas aceitam valores do tipo inteiro.");
                        Console.WriteLine("Por favor volte a introduzir o id.");
                    }
                }catch(NotFoundTipoAlojamentoException ex){Console.WriteLine("\n" + ex.Message + "\nPor favor volte a inserir o id.\n\n ");}

            }while(!endWhile);
            endWhile = false;

            do{
                Console.Write("Lotacao (" + oldAlojamento.lotacao + "): ");
                string newLotacao = Console.ReadLine();
                if(newLotacao.Equals(""))
                    newLotacao = "-1";
                int iLotacao = -1;
                if(int.TryParse(newLotacao, out iLotacao))
                {
                    if (iLotacao == -1)
                        {
                            newAlojamento.lotacao = oldAlojamento.lotacao;
                            endWhile = true;
                        }else{
                            newAlojamento.IDAlojamento = iLotacao;
                            endWhile = true;
                        }
                }else{
                    Console.WriteLine("A lotacao so aceita valores inteiros.");
                    Console.WriteLine("Por favor volte a introduzir a lotacao.");
                }
            }while(!endWhile);
            endWhile = false;

            Console.WriteLine("Telefone (" + oldAlojamento.telefone + "): ");
            String newTelefone = Console.ReadLine();
            if(newTelefone == "")
                newAlojamento.telefone = oldAlojamento.telefone;
            else
                newAlojamento.telefone = newTelefone;


            Console.WriteLine("Email (" + oldAlojamento.email + "): ");
            String newEmail = Console.ReadLine();
            if(newEmail == "")
                newAlojamento.email = oldAlojamento.email;
            else
                newAlojamento.morada = newEmail;

            do{
                try{
                    Console.Write("IdLocal (" + oldAlojamento.IDLocal + "): ");
                    string newIdLocal = Console.ReadLine();
                    if(newIdLocal.Equals(""))
                        newIdLocal = "-1";
                    int id = -1;
                    if(int.TryParse(newIdLocal, out id))
                    {
                        if (id == -1)
                            {
                                newAlojamento.IDLocal = oldAlojamento.IDLocal;
                                endWhile = true;
                            }else{
                                newAlojamento.IDLocal = id;
                                endWhile = true;
                            }
                    }else{
                        Console.WriteLine("Os id's apenas aceitam valores do tipo inteiro.");
                        Console.WriteLine("Por favor volte a introduzir o id.");
                    }
                }catch(NotFoundLocalException ex){Console.WriteLine("\n" + ex.Message + "\nPor favor volte a inserir o id.\n\n ");}
            }while(!endWhile);
            endWhile = false;

            do{
                try{
                    Console.Write("IDCategoria (" + oldAlojamento.IDCategoria + "): ");
                    string newIDCategoria = Console.ReadLine();
                    if(newIDCategoria.Equals(""))
                        newIDCategoria = "-1";
                    int id = -1;
                    if(int.TryParse(newIDCategoria , out id))
                    {
                        if (id == -1)
                            {
                                newAlojamento.IDCategoria = oldAlojamento.IDCategoria;
                                endWhile = true;
                            }else{
                                newAlojamento.IDCategoria = id;
                                endWhile = true;
                            }
                    }else{
                        Console.WriteLine("Os id's apenas aceitam valores do tipo inteiro.");
                        Console.WriteLine("Por favor volte a introduzir o id.");
                    }
                }catch(NotFoundCategoriaException ex){Console.WriteLine("\n" + ex.Message + "\nPor favor volte a inserir o id.\n\n ");}
            }while(!endWhile);
            endWhile = false;
            
            try
            {
                Console.WriteLine("Tem a certeza que pretende alterar o registo do tipo de transporte " + oldAlojamento.nome + "? (y/n)");
                string resposta = Console.ReadLine();
                if (resposta == "y" || resposta == "Y" || resposta == "yes" || resposta == "Yes")
                {
                    Console.WriteLine("\nA alterar . . .\n");
                    alojamento.update(newAlojamento);
                    Console.WriteLine("Dados do alojamento alterados com sucesso!\n\n");
                    operarSobreAlojamento(newAlojamento);
                }
            }
            catch (Exception e) { Console.WriteLine(e.Message); Console.WriteLine(newAlojamento); operarSobreAlojamento(oldAlojamento); }
            operarSobreAlojamento(oldAlojamento);
        }

        private static void eliminarAlojamento(BTO.Alojamento toDelete)
        {
            Console.WriteLine("Tem a certeza que pretende eliminar o registo do Alojamento " + toDelete.nome + "? (y/n)");
            string resposta = Console.ReadLine();
            if (resposta == "y" || resposta == "Y" || resposta == "yes" || resposta == "Yes")
            {
                Console.WriteLine("\nA calcular dependencias . . .\n");
                BLLReserva reservasAlojamento = new BLLReserva();
                List<BTO.Reserva> listaDependentes = reservasAlojamento.getByAlojamento(toDelete.IDAlojamento);
                if (listaDependentes.Count == 0)
                {
                    Console.WriteLine("\nA eliminar . . .\n");
                    BLLAlojamento alojamento = new BLLAlojamento();
                    alojamento.delete(toDelete.IDAlojamento);
                    Console.WriteLine("Alojamento eliminado com sucesso!\n\n");
                }
                else { Console.WriteLine("O alojamento que pretende eliminar esta associado a determinadas reservas."); }
            }
            else {menuConsultarAlojamentos();}
            operarSobreAlojamento(toDelete);
        }
    }
}
